home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 18 / AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso / Forum / MichaelRoth / 3-3-99 / subs / CheckSumm.b.w.l.asm next >
Assembly Source File  |  1998-08-15  |  3KB  |  77 lines

  1.          Xref      GetChecksumByte
  2.          Xref      GetChecksumWord
  3.          Xref      GetChecksumLong
  4.  
  5. ; A0 -> Key
  6. ; D0 -> Länge des Keys (word Grenze!)
  7. ; D0 <- CheckSumme
  8.  
  9. GetChecksumByte
  10.          movem.l   d1,-(sp)
  11.          moveq     #0,d1
  12.          move.b    (a0)+,d1
  13.          sub.w     #2,d0
  14. .loop
  15.          eor.b     (a0)+,d1
  16.          dbra      d0,.loop
  17.          move.l    d1,d0
  18.          movem.l   (sp)+,d1
  19.          rts
  20.  
  21. GetChecksumWord
  22.          movem.l   d1/d7,-(sp)
  23.          move.l    d0,d1                         ; Länge nach D0
  24.          duvu.l    #2,d1                         ; Dividiren
  25.          swap      d1                            ; Rest ins untere Word
  26.          moveq     #0,d1                         ; Rest löschen
  27.          swap      d1                            ; wieder wechseln
  28.          sub.w     d1,d7                         ; nach d7
  29.          lsl.l     #1,d1                         ; mit 2 Multiplizieren
  30.          sub.w     d1,d0                         ; Rest bestimmen
  31.          moveq     #0,d1                         ; Register löschen
  32.          move.w    (a0)+,d1                      ; 1 Word lesen
  33.          sub.w     #2,d7                         ; 2 Abziehen (1 für DBcc und 1 wegen 1 bereits gelesenen Word)
  34. .loop
  35.          eor.w     (a0)+,d1                      ; CheckSumm bilden
  36.          dbra      d7,.loop                      ;
  37.  
  38.          tst.w     d0                            ; Prüfen ob Rest = 0
  39.          beq       .end                          ; Wenn ja beenden
  40.          eor.b     (a0)+,d1                      ; Ansonsten Leztes Byte verwerten
  41. .end
  42.          move.l    d1,d0                         ; Checksumme nach D0
  43.          movem.l   (sp)+,d1/d7
  44.  
  45.          rts
  46.  
  47. GetChecksumLong
  48.          movem.l   d1/d7,-(sp)
  49.          move.l    d0,d1                         ; Länge nach D0
  50.          duvu.l    #4,d1                         ; Dividiren
  51.          swap      d1                            ; Rest ins untere Word
  52.          moveq     #0,d1                         ; Rest löschen
  53.          swap      d1                            ; wieder wechseln
  54.          sub.w     d1,d7                         ; nach d7
  55.          lsl.l     #2,d1                         ; mit 2 Multiplizieren
  56.          sub.w     d1,d0                         ; Rest bestimmen
  57.          moveq     #0,d2
  58.          move.w    (a0)+,d1
  59.          sub.w     #1,d7
  60. .loop
  61.          eor.l     (a0)+,d1
  62.          dbra      d7,.loop
  63.          move.l    d1,d0
  64.  
  65.          cmp.w     #2,d0                         ; Weniger als 2 Bytes übrig ?
  66.          blt       .1                            ; Nein -> .1
  67.          eor.w     (a0)+,d1                      ; Ansonsten 1 Wort berechnen
  68.          sub.w     #2,d0                         ; Und Zähler verringern
  69. .1
  70.          cmp.w     #1,d0                         ; 1 Byte über ?
  71.          blt       .end                          ; Nein beenden
  72.          eor.b     (a0)+,d1                      ; Ansonsten auch noch mitnehmen
  73. .end
  74.          move.l    d1,d0
  75.          movem.l   (sp)+,d1/d7
  76.          rts
  77.